/**
 * 数组的迭代方法 
 * 1.每一个方法都接受两个参数，一个函数和当前执行换进的上下文context，这个作用域决定了this的指向
 * 但是还是遍历的时候，还是要加上obj.arr才能取得正确的数组
 * 2.传入的函数接受3个参数，当前值，当前值的索引，当前遍历的数组
 */
// every   返回true/false 当每一项符合校验条件则返回true
var name = 'lee'
var valadiate = [1, 2, 3, 4, 5, undefined, null]
var valadiateObj = {
  name: 'can',
  valadiate:  [1, 2, 3, 4, 5]
}
var vaEvery = valadiate.every(function(item, index, arr) {
  return typeof item === 'number'
})
console.log('vaEvery', vaEvery) // false

var vaEvery2 = valadiateObj.valadiate.every(function(item, index, arr) {
  console.log(this.name) // can 第二个参数改变了this的指向，如果不传valadiateObj,将会打印出lee
  return typeof item === 'number'
}, valadiateObj)
console.log('vaEvery2', vaEvery2) // true

// filter 返回一个数组  符合校验规则的每一项组成的数组
var filterArray = [1, 2, 3, 4, 5, 6, 7]
var filter = filterArray.filter(function(item, index, arr) {
  return item > 3
})
console.log(filter) // [4, 5, 6, 7]
console.log(filterArray) // [1, 2, 3, 4, 5, 6, 7]  说明没有改变原数组

// forEach 无返回，只是对传入数组的每一项运行传入的函数 本质与for循环一样
/**
 * 不能使用break,会报错
 * forEach无法跳出循环，除非throw Error()
 */
var forArray = [1, 2, 3, 4, 5, 6, 7]
// break 报错
try {
  var forEach = forArray.forEach(function(item, index, arr) {
    if (item === 4) {
      break // Illegal break statement
    }
    console.log(item)
  })
} catch (e) {
  console.log(e)
}
// return 相当于for循环中的continue
try {
  var forEach = forArray.forEach(function(item, index, arr) {
    if (item === 4) {
      return // 不报错。相当于continue
    }
    console.log(item) // 123567 没打印出4  跟for循环中的continue一个效果
  })
} catch (e) {
  console.log(e)
}
// continue 直接报错
try {
  var forEach = forArray.forEach(function(item, index, arr) {
    if (item === 4) {
      continue // Illegal break statement 直接报错
    }
    console.log(item)
  })
} catch (e) {
  console.log(e)
}
var forEachArray = forArray.forEach(function(item, index, arr) {
  item = item + 1
})
console.log('forArray', forArray) // [1, 2, 3, 4, 5, 6, 7] 没有变化，说明forEach没有改变原数组
console.log('forEachArray', forEachArray) // undefined  说明forEach无返回
// map() 返回调用结果返回的数组  返回一个数组，经过处理函数处理的数组。并且不改变原数组
var mapArr = [1, 2, 3, 4, 5]
var map = mapArr.map(function(item, index, arr) {
  return item + 1
})
console.log('mapArr', mapArr) // [1, 2, 3, 4, 5] 
console.log('map', map) // [2, 3, 4, 5, 6]

// some 返回true/false 如果数组中有任何一个元素符合校验条件
var someArr = [1, 2, 3, 4, 5]
var valadiateSome = someArr.some(function(item, index, arr) {
  return item > 4
})
console.log('valadiateSome', valadiateSome) //true